---------------------------------------------------------
--- Copyright：  迷你玩-海马
--- Description：服务器失败或者超时调用熔断
--- 某些允许失败的查询业务使用，重要数据业务视情况接入

--- 调用账号服 或者好友服 失败太多的时候，进行熔断处理
--- 起始分100分
--- 每次失败 - 20分 最小-100分  （小于0分熔断）
--- 每次成功 + 10分 最大 100分
--- 失败期间，每次调用恢复+1分， 大于等于0恢复调用
---------------------------------------------------------

local require  = require;
local ngx      = ngx;
local debug    = debug;
local string   = string;
local tonumber = tonumber;

local pairs = pairs
local setmetatable = setmetatable

----数据变量----
local uu         = require("modules.commhm.utils");
local log        = require("modules.commhm.log");
local ns_time    = require("modules.commhm.time");

-------------------------------------

local FOO = {
	_VERSION = '0.12.1',

	data = {};
}


-----尝试调用，如果处于熔断期间，则直接返回失败
-----返回 0=成功  其他=失败
function FOO.if_can_call( key_ )
	if  not FOO.data[key_] then
		FOO.data[key_] = { succ=100, fail=0 }
	end

	if  FOO.data[key_].succ >= 0 then
		return 0  ---可以调用
	else
		FOO.data[key_].succ = FOO.data[key_].succ + 1
		return 1  ---失败期间不断+1
	end

end



-----调用后，设置本次调用成功或者失败
--- ret_code_  0=成功  其他=失败
function FOO.set_call_ret( key_, ret_code_, msg_ )
	if  not FOO.data[key_] then
		FOO.data[key_] = { succ=100, fail=0 }
	end

	if  ret_code_ == 0 then
		if  FOO.data[key_].succ == 100 then
			return
		end

		FOO.data[key_].succ = FOO.data[key_].succ + 10
		if  FOO.data[key_].succ >= 100 then
			log.day_list( "protect_breaker", "recover", ngx.worker.id(),
					key_, FOO.data[key_].succ, FOO.data[key_].fail )  ---恢复
			FOO.data[key_].fail = 0
			FOO.data[key_].succ = 100
		end

	else
		FOO.data[key_].fail = FOO.data[key_].fail + 1

		---每连续失败10次打一次日志
		if  FOO.data[key_].fail % 10 == 0 then
			log.day_list( "protect_breaker", "error", ngx.worker.id(),
					key_ , FOO.data[key_].succ, FOO.data[key_].fail, msg_ )
		end

		if  FOO.data[key_].succ == -100 then
			return
		end

		FOO.data[key_].succ = FOO.data[key_].succ - 20
		if  FOO.data[key_].succ <= -100 then
			FOO.data[key_].succ = -100
		end
	end
end



return FOO;
